LLVM IR
言語やアーキテクチャから独立した独自の中間表現
オンメモリで扱えるぐらいに軽量
LLVMでJIT Compilerを利用できるようにするため
命令の多くはアセンブリに似た3番地コード
変数はレジスタに保存される
全てのレジスタ変数がSSA形式
2つの形式がある
LLVMアセンブリ
LLVM bitcode
バイナリ形式
バイナリなだけであって、LLVMアセンブリの命令と一対一対応している
拡張子は.bc
LLVM Language Reference Manual — LLVM 10 documentation
(5)语法树模型的基本结构 · 编译器架构的王者LLVM · 看云
LLVM IRを読みたい
区分 ref
Module
Functionを複数持つ
Function
BasicBlockを複数持つ
C++の関数と同じ
とは #??
BasicBlock
Instructionを複数持つ
ラベルごとで分けられる
Instruction
一つの命令
それぞれ包含関係でModuleが全てを包含している
LLVM IRの形式
インメモリcompiler-IR
メモリ上のIR表現
ディスク上のビットコード表現
アセンブリ形式の表現
これのみが人間でも読めるもの(?)
基本的な中間表現
『きつねさんでもわかるLLVM ~コンパイラを自作するためのガイドブック』.icon p.38~がすごい詳しい
出力されたコード
Data Layout
データの配置方法
リトルエンディアンとかビッグエンディアンとか
.llのBasicBlockの遷移をグラフにする
手順
$ opt -S hoge.ll -dot-cfg
$ dot -Teps .main.dot -o hoge.eps
以下のような画像が出力される
https://gyazo.com/05dc7e90217d53c874fa03556c91f7f6
http://hzawawa.hatenablog.com/entry/2015/08/09/170225
参考
『きつねさんでもわかるLLVM ~コンパイラを自作するためのガイドブック』